package com.review.day02;
/**
 * 抽象类特点：<补充>
 *   抽象类=类：成员变量+构造方法+成员方法
 *   成员变量：既可以是变量也可以是常量，也可以是常量
 *   构造方法：有
 *           用于子类访问父类的数据【父类默认初始化的内容】
 *   成员方法：既可以是抽象的，也可以是非抽象的
 * 抽象方法的特性：
 *   A:抽象方法----目的：强制子类作的事情【子类一定重写】
 *   B:非抽象方法--目的：子类继承的事情，提高代码复用性【与普通父类一样】
 */

abstract class Foo{
    //成员变量
    public int i=10;
    //成员变量加上final 也可以叫常量【识别常量：标识符全大写】
    public final int J=20; //Java强类型语言：标识符大小写分明
    // public int j=30;
    public Foo() {//创建对象的同时一并创建：初始化
   this(30);
    }
    public Foo(int i) {
        this.i = i;
    }
    //成员方法：抽象【重写】，非抽象【提高复用-继承父类】
    public abstract void show();
    public void method(){
        System.out.println("Foo----method");
    }
}
//无法实例化【无法直接创建对象】--继承--多态性--利用造型
//Goo 子类【实现类】继承 抽象类  子类必须重写抽象类当中的所有抽象方法
class Goo extends Foo{
    public void show() { //抽象类 抽象方法show()---一定重写
        System.out.println("show Goo");
    }
    public void method(){
        System.out.println("Goo method");
    }
}
public class 抽象类的特点1 {
    public static void main(String[] args) {
        //创建对象---实例化 抽象类无法实例化
        Foo f=new Goo();
        //①实例化 初始化Goo()构造器，类默认存在空构造器
        //②空构造器默认存在：super() 调用父类无参构造器
        //③父类无参构造器中存在：this()调用本类有参构造器
        //④this(参数)给Foo抽象类的i值进行覆盖  i=30
        System.out.println(f.i);//⑤引用调取i值 打印30
        //调取抽象类当中的常量,不可以给常量赋值
        System.out.println(f.J);

        //---------------------------------------
        f.show(); //抽象方法重写             Goo show
        f.method();//非抽象方法  选择实现重写  Foo show

    }
}
